其他
一文看懂 YAML
前言
- 内容碎片化,阅读起来不够流畅
- 讲解较为生硬,阅读起来比较费劲
- 缺少对比,难以让人快速理解
> 可能是东半球最通俗易懂的 YAML 中文讲解之一(手动狗头)
简介
基本语法
one: 2
- 缩进的空格数量不重要,但是同一层级的元素左侧必须对齐
one:
two: 2
three:
four: 4
five: 5
// 以上的内容转成 JSON 后
"one": {
"two": 2,
"three": {
"four": 4,
"five": 5
}
}
# 我也是注释
- 用“ ... ”即三个小数点表示一份内容的结束(非必需)
# 这是第一份内容
one: 1
# 其他内容...
...
---
# 这是第二份内容
two: 2
# 其他内容...
数据结构与类型
表示以键值对(key: value)形式出现的数据
key: value
// JSON
"key": "value"
key:
child-key1: value1
child-key2: value2
// JSON
"key": {
"child-key1": "value1",
"child-key2": "value2",
}
key: { child-key1: value1, child-key2: value2 }
// JSON
"key": { "child-key1": "value1", "child-key2": "value2" }
?
- keypart1
- keypart2
:
- value1
- value2
—▼—
values:
- value1
- value2
- value3
// JSON
"values": ["value1", "value2", "value3"]
values: [value1, value2, value3]
// JSON
"values": ["value1", "value2", "value3"]
values:
-
- value1
- value2
-
- value3
- value4
// JSON
"values": [[ "value1", "value2"], ["value3", "value4"]]
—▼—
表示 YAML 中最基本的数据类型
1. 字符串一般不需要用引号包裹,但是如果字符串中使用了反斜杠“\”开头的转义字符就必须使用引号包裹
strings:
- Hello without quote # 不用引号包裹
- Hello
world # 拆成多行后会自动在中间添加空格
- 'Hello with single quotes' # 单引号包裹
- "Hello with double quotes" # 双引号包裹
- "I am fine. \u263A" # 使用双引号包裹时支持 Unicode 编码
- "\x0d\x0a is \r\n" # 使用双引号包裹时还支持 Hex 编码
- 'He said: "Hello!"' # 单双引号支持嵌套"
// JSON
"strings":
["Hello without quote",
"Hello world",
"Hello with single quotes",
"Hello with double quotes",
"I am fine. ☺",
"\r\n is \r\n",
"He said: 'Hello!'"]
2. 对于多行的文字,YAML 提供了两种特殊的语法支持
> 使用竖线符“ | ”来表示该语法,每行的缩进和行尾空白都会被去掉,而额外的缩进会被保留
lines: |
我是第一行
我是第二行
我是吴彦祖
我是第四行
我是第五行
// JSON
"lines": "我是第一行\n我是第二行\n 我是吴彦祖\n 我是第四行\n我是第五行"
> 使用右尖括号“ > ”来表示该语法,只有空白行才会被识别为换行,原来的换行符都会被转换成空格
lines: >
我是第一行
我也是第一行
我仍是第一行
我依旧是第一行
我是第二行
这么巧我也是第二行
// JSON
"lines": "我是第一行 我也是第一行 我仍是第一行 我依旧是第一行\n我是第二行 这么巧我也是第二行"
1. “true”、“True”、“TRUE”、“yes”、“Yes”和“YES”皆为真
2. “false”、“False”、“FALSE”、“no”、“No”和“NO”皆为假
boolean:
- true # True、TRUE
- yes # Yes、YES
- false # False、FALSE
- no # No、NO
// JSON
"boolean": [true, true, false, false]
支持二进制表示
int:
- 666
- 0001_0000 # 二进制表示
// JSON
"int": [666, 4096]
支持科学计数法
float:
- 3.14
- 6.8523015e+5 # 使用科学计数法
// JSON
"float": [3.14, 685230.15]
“null”、“Null”和“~”都是空,不指定值默认也是空
nulls:
- null
- Null
- ~
-
// JSON
"nulls": [null, null, null, null]
—▼—
> 这里使用 JavaScript 对象进行对比
date1: 2020-05-26
date2: 2020-05-26T01:00:00+08:00
dete3: 2020-05-26T02:00:00.10+08:00
date4: 2020-05-26 03:00:00.10 +8
// JavaScript
date1: Tue May 26 2020 08:00:00 GMT+0800 (中国标准时间),
date2: Tue May 26 2020 01:00:00 GMT+0800 (中国标准时间),
dete3: Tue May 26 2020 02:00:00 GMT+0800 (中国标准时间),
date4: Tue May 26 2020 03:00:00 GMT+0800 (中国标准时间)
—▼—
a: !!float '666' # !! 为严格类型标签
b: '666' # 其实双引号也算是类型转换符
c: !!str 666 # 整数转为字符串
d: !!str 666.66 # 浮点数转为字符串
e: !!str true # 布尔值转为字符串
f: !!str yes # 布尔值转为字符串
// JSON
"a": 666,
"b": "666",
"c": "666",
"d": "666.66",
"e": "true"
"f": "yes"
—▼—
数据重用与合并
a: &anchor # 设置锚点
one: 1
two: 2
three: 3
b: *anchor # 引用锚点
// JSON
"a": {
"one": 1,
"two": 2,
"three": 3
},
"b": {
"one": 1,
"two": 2,
"three": 3
}
human: &base # 添加名为 base 的锚点
body: 1
hair: 999
singer:
<<: *base # 引用 base 锚点,实例化时会自动展开
skill: sing # 添加额外的属性
programer:
<<: *base # 引用 base 锚点,实例化时会自动展开
hair: 6 # 覆写 base 中的属性
skill: code # 添加额外的属性
// JSON
"human": { "body": 1, "hair": 999 },
"singer": { "body": 1, "hair": 999, "skill": "sing" },
"programer": { "body": 1, "hair": 6, "skill": "code" }
相关链接
https://yaml.org
https://yaml.org/spec/1.2/spec.html
https://zh.wikipedia.org/wiki/YAML
https://www.json2yaml.com/convert-yaml-to-json
结束语
扫描二维码
获取更多精彩
菜鸟小栈